/**
 * 
 */
package com.lifeware.research.endo.services;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.springframework.stereotype.Service;

import com.lifeware.research.endo.models.dao.IAcromegaliaSchedeBaseDao;
import com.lifeware.research.endo.models.dao.IImmunoistochimicaDao;
import com.lifeware.research.endo.models.dao.IPatologieDao;
import com.lifeware.research.endo.models.dao.ITerapieMedicheDao;
import com.lifeware.research.endo.models.entities.AcromegaliaSchedeBase;
import com.lifeware.research.endo.models.entities.EsamiStrumentali;
import com.lifeware.research.endo.models.entities.Immunoistochimica;
import com.lifeware.research.endo.models.entities.MmAcroSbPatologie;
import com.lifeware.research.endo.models.entities.MmAcromegaliaSbImmunoistochimica;
import com.lifeware.research.endo.models.entities.MmAcromegliaSbTerapieMediche;
import com.lifeware.research.endo.models.entities.Patologie;
import com.lifeware.research.endo.models.entities.TerapieMediche;
import com.lifeware.research.endo.views.AcromegaliaSchedaBase;

/**
 * 
 * 
 * @author  Riccardo Cardin, (C) 2012 Lifeware
 * @version 1.0
 */
@Service
public class AcromegaliaService extends MalattieService {

	private IAcromegaliaSchedeBaseDao acromegaliaSchedeBaseDao;

	/**
	 * <p>Ritorna la scheda base per l'acromegalia con identificativo in ingresso.
	 * </p>
	 * 
	 * @param idMalattia L'identificativo della malattia.
	 * 
	 * @return Una scheda base per l'acromegalia.
	 */
	public AcromegaliaSchedaBase getSchedaBase(Integer idMalattia) {

		AcromegaliaSchedaBase acroSBView = null;

		if (idMalattia != null) {

			/* Recupero la scheda base originale */
			AcromegaliaSchedeBase acroSBorig = 
					this.acromegaliaSchedeBaseDao.findById(idMalattia);

			/* Effettuo la mappatura */
			acroSBView = this.map(acroSBorig);

		}   // if (idMalattia != null)...

		return acroSBView;
	}
	
	/**
	 * <p>Recupera il bean della malattia per identificativo.
	 * </p>
	 * 
	 * @param idMalattia Identificativo della malattia.
	 * 
	 * @return Bean della malattia.
	 */
	private AcromegaliaSchedeBase getSchedaBaseBean(Integer idMalattia) {
		
		AcromegaliaSchedeBase acroSB = null;
		
		if (idMalattia != null) {
			
			acroSB = this.acromegaliaSchedeBaseDao.findById(idMalattia);
		}   // end if (idMalattia != null)...
		
		return acroSB;
	}

	/**
	 * <p>Effettua la conversione fra un bean e un oggetto per la 
	 *    visualizzazione di una scheda base per l'acromegalia.
	 * </p>
	 * 
	 * @param acroDBorig Il bean rappresentanto la scheda base per 
	 *        l'acromegalia.
	 * 
	 * @return L'oggetto di visualizzazione.
	 */
	public AcromegaliaSchedaBase map(AcromegaliaSchedeBase acroDBorig)  {

		AcromegaliaSchedaBase acroSBView = new AcromegaliaSchedaBase();

		if (acroDBorig != null) {

			/* Effettuo la mappatura per la visualizzazione */
			Integer annoDiagnosi = acroDBorig.getAnnoDiagnosi();
			acroSBView.setAnnoDataDiagnosi(annoDiagnosi != null ? annoDiagnosi.shortValue() : 0);
			Integer meseDiagnosi = acroDBorig.getMeseDiagnosi();
			acroSBView.setMeseDataDiagnosi(meseDiagnosi != null ? meseDiagnosi.shortValue() : 0);

			Double[] ritmoGH = new Double[3];
			BigDecimal ritmo1 = acroDBorig.getRitmoGh1();
			ritmoGH[0] = ritmo1 != null ? ritmo1.doubleValue() : 0.0D;
			BigDecimal ritmo2 = acroDBorig.getRitmoGh2();
			ritmoGH[1] = ritmo2 != null ? ritmo2.doubleValue() : 0.0D;
			BigDecimal ritmo3 = acroDBorig.getRitmoGh3();
			ritmoGH[2] = ritmo3 != null ? ritmo3.doubleValue() : 0.0D;
			acroSBView.setRitmoGH(ritmoGH);

			BigDecimal igf1 = acroDBorig.getIgf1();
			acroSBView.setIgf1(igf1 != null ? igf1.doubleValue() : 0.0D);

			Double[] ogttH = new Double[5];
			BigDecimal ogttGh0 = acroDBorig.getOgttGh0();
			ogttH[0] = ogttGh0 != null ? ogttGh0.doubleValue() : 0.0D;
			BigDecimal ogttGh30 = acroDBorig.getOgttGh30();
			ogttH[1] = ogttGh30 != null ? ogttGh30.doubleValue() : 0.0D;
			BigDecimal ogttGh60 = acroDBorig.getOgttGh60();
			ogttH[2] = ogttGh60 != null ? ogttGh60.doubleValue() : 0.0D;
			BigDecimal ogttGh90 = acroDBorig.getOgttGh90();
			ogttH[3] = ogttGh90 != null ? ogttGh90.doubleValue() : 0.0D;
			BigDecimal ogttGh120 = acroDBorig.getOgttGh120();
			ogttH[4] = ogttGh120 != null ? ogttGh120.doubleValue() : 0.0D;
			acroSBView.setOgttGH(ogttH);

			Double[] ogttGlicemia = new Double[5];
			BigDecimal ogttGlicemia0 = acroDBorig.getOgttGlicemia0();
			ogttGlicemia[0] = ogttGlicemia0 != null ? ogttGlicemia0.doubleValue() : 0.0D;
			BigDecimal ogttGlicemia30 = acroDBorig.getOgttGlicemia30();
			ogttGlicemia[1] = ogttGlicemia30 != null ? ogttGlicemia30.doubleValue() : 0.0D;
			BigDecimal ogttGlicemia60 = acroDBorig.getOgttGlicemia60();
			ogttGlicemia[2] = ogttGlicemia60 != null ? ogttGlicemia60.doubleValue() : 0.0D;
			BigDecimal ogttGlicemia90 = acroDBorig.getOgttGlicemia90();
			ogttGlicemia[3] = ogttGlicemia90 != null ? ogttGlicemia90.doubleValue() : 0.0D;
			BigDecimal ogttGlicemia120 = acroDBorig.getOgttGlicemia120();
			ogttGlicemia[4] = ogttGlicemia120 != null ? ogttGlicemia120.doubleValue() : 0.0D;
			acroSBView.setOgttGlicemia(ogttGlicemia);

			Double[] ogttInsulina = new Double[5];
			BigDecimal ogttInsulina0 = acroDBorig.getOgttInsulina0();
			ogttInsulina[0] = ogttInsulina0 != null ? ogttInsulina0.doubleValue() : 0.0D;
			BigDecimal ogttInsulina30 = acroDBorig.getOgttInsulina30();
			ogttInsulina[1] = ogttInsulina30 != null ? ogttInsulina30.doubleValue() : 0.0D;
			BigDecimal ogttInsulina60 = acroDBorig.getOgttInsulina60();
			ogttInsulina[2] = ogttInsulina60 != null ? ogttInsulina60.doubleValue() : 0.0D;
			BigDecimal ogttInsulina90 = acroDBorig.getOgttInsulina90();
			ogttInsulina[3] = ogttInsulina90 != null ? ogttInsulina90.doubleValue() : 0.0D;
			BigDecimal ogttInsulina120 = acroDBorig.getOgttInsulina120();
			ogttInsulina[4] = ogttInsulina120 != null ? ogttInsulina120.doubleValue() : 0.0D;
			acroSBView.setOgttInsulina(ogttInsulina);

			Double[] dimensioni = new Double[3];
			BigDecimal dimAdenomaX = acroDBorig.getDimAdenomaX();
			dimensioni[0] = dimAdenomaX != null ? dimAdenomaX.doubleValue() : 0.0D;
			BigDecimal dimAdenomaY = acroDBorig.getDimAdenomaY();
			dimensioni[1] = dimAdenomaY != null ? dimAdenomaY.doubleValue() : 0.0D;
			BigDecimal dimAdenomaZ = acroDBorig.getDimAdenomaZ();
			dimensioni[2] = dimAdenomaZ != null ? dimAdenomaZ.doubleValue() : 0.0D;
			acroSBView.setDimensioni(dimensioni);

			acroSBView.setTipoAdenoma(acroDBorig.getTipoAdenoma());
			acroSBView.setInvasivo(acroDBorig.getFlgInvasivo() == 0 ? true : false);

			/* Recupero le terapia mediche */
			acroSBView.setTerapiaMedicaDescrizione(acroDBorig.getDescrizioneTerapiaMedica());
			@SuppressWarnings("unchecked")
			Set<MmAcromegliaSbTerapieMediche> terapieMediche = acroDBorig.getMmAcromegliaSbTerapieMediches();
			ArrayList<TerapieMediche> listaTerapia = new ArrayList<>();
			ArrayList<Integer> listaTerapiaIds = new ArrayList<>();
			TerapieMediche[] terapieArray = new TerapieMediche[terapieMediche.size()];
			Integer[] terapieMedicheIds = new Integer[terapieMediche.size()];
			TerapieMediche currTerapia = null;
			for (MmAcromegliaSbTerapieMediche terapia : terapieMediche) {

				currTerapia = terapia.getTerapieMediche();
				listaTerapia.add(currTerapia);
				listaTerapiaIds.add(currTerapia.getIdTerapiaMedica());
			}
			acroSBView.setTerapieMedicheView(listaTerapia.toArray(terapieArray));
			acroSBView.setTerapieMediche(listaTerapiaIds.toArray(terapieMedicheIds));

			Integer flgRadioterapia = acroDBorig.getFlgRadioterapia();
			acroSBView.setRadioterapia((flgRadioterapia != null && flgRadioterapia == 0) ? true : false);
			acroSBView.setRadioterapiaDescr(acroDBorig.getDescrizioneRadioterapia());

			Integer flgAdenomiIpofisari = acroDBorig.getFlgAdenomiIpofisari();
			acroSBView.setAdenomiIpofisari((flgAdenomiIpofisari != null && flgAdenomiIpofisari == 0) ? true : false);
			acroSBView.setAdenomiIpofisariDescr(acroDBorig.getDescrizioneAdenomiIpofisari());

			Integer flgNeoplasia = acroDBorig.getFlgNeoplasia();
			acroSBView.setNeoplasia(flgNeoplasia != null && flgNeoplasia == 0 ? true : false);
			acroSBView.setNeoplasiaDescr(acroDBorig.getDescrizioneNeoplasia());

			acroSBView.setRaccordoAnamnesticoDescr(acroDBorig.getDescrizioneRaccordoAnamnestico());

			Integer annoChirurgia = acroDBorig.getAnnoChirurgia();
			acroSBView.setInterventoAnno(annoChirurgia != null ? annoChirurgia.shortValue() : null);
			Integer meseChirurgia = acroDBorig.getMeseChirurgia();
			acroSBView.setInterventoMese(meseChirurgia != null ?  meseChirurgia.shortValue() : null);

			Integer flgIstologia = acroDBorig.getFlgIstologia();
			acroSBView.setIstologia(flgIstologia != null && flgIstologia == 0 ? true : false);
			acroSBView.setIstologiaDescrizione(acroDBorig.getDescrizioneIstologia());

			/* Immunoistochimica */
			@SuppressWarnings("rawtypes")
			Set<MmAcromegaliaSbImmunoistochimica> mmAcroImmuno = acroDBorig.getMmAcromegaliaSbImmunoistochimicas();
			Map<String, Boolean> immunoIstochimiche = new HashMap<String, Boolean>();
			Map<Integer, Boolean> immunoIstochimicaTrueMap = new HashMap<Integer, Boolean>();
			Map<Integer, Boolean> immunoIstochimicaFalseMap = new HashMap<Integer, Boolean>();
			Integer plus = null;

			for (MmAcromegaliaSbImmunoistochimica mmAcromegaliaSbImmunoistochimica : mmAcroImmuno) {

				Immunoistochimica immuno = mmAcromegaliaSbImmunoistochimica.getImmunoistochimica();
				plus = mmAcromegaliaSbImmunoistochimica.getFlgPlus();

				immunoIstochimiche.put(immuno.getDescrizioneImmunoistochimica(), 
						(plus != null && plus == 0) ? true : false);
				if (plus != null && plus == 0) {
					
					immunoIstochimicaTrueMap.put(immuno.getIdImmunoistochimica(), true);
				} else {
					immunoIstochimicaFalseMap.put(immuno.getIdImmunoistochimica(), true);
				}
				
			}
			acroSBView.setImmunoIstoChimicaOut(immunoIstochimiche);
			acroSBView.setImmunoIstoChimicaTrue(immunoIstochimicaTrueMap);
			acroSBView.setImmunoIstoChimicaFalse(immunoIstochimicaFalseMap);
			
			Integer meseEcoTiroide = acroDBorig.getMeseEcografiaTiroide();
			acroSBView.setEcoTiroideMese(meseEcoTiroide != null ? meseEcoTiroide.shortValue() : null);
			Integer annoEcoTiroide = acroDBorig.getAnnoEcografiaTiroide();
			acroSBView.setEcoTiroideAnno(annoEcoTiroide != null ? annoEcoTiroide.shortValue() : null);

			Integer flagAgoAspirato = acroDBorig.getFlgEcografiaTiroideAgoAspirato();
			acroSBView.setAgoaspirato(flagAgoAspirato != null && flagAgoAspirato == 0 ? true : false);
			acroSBView.setAgoaspiratoDescr(acroDBorig.getDescrizioneEcografiaTiroideAa());

			EsamiStrumentali esamiStrumentaliTiroide = acroDBorig.getEsamiStrumentaliByIdEsameStrumentaleEcografiaTiroide();
			acroSBView.setTipoTiroide(esamiStrumentaliTiroide != null ? esamiStrumentaliTiroide.getTipo() : AcromegaliaSchedaBase.NESSUN_VALORE);

			Integer meseColonscopia = acroDBorig.getMeseColonscopia();
			acroSBView.setColonscopiaMese(meseColonscopia != null ? meseColonscopia.shortValue() : null);
			Integer annoColonscopia = acroDBorig.getAnnoColonscopia();
			acroSBView.setColonscopiaAnno(annoColonscopia != null ? annoColonscopia.shortValue() : null);

			Integer flgColonscopia = acroDBorig.getFlgColonscopiaIstologia();
			acroSBView.setIstoColonscopia(flgColonscopia != null && flgColonscopia == 0 ? true : false);
			acroSBView.setIstoColonscopiaDescr(acroDBorig.getDescrizioneColonscopiaIstologia());

			EsamiStrumentali esamiStrumentaliColonscopia = acroDBorig.getEsamiStrumentaliByIdEsameStrumentaleColonscopia();
			acroSBView.setTipoColonscopia(esamiStrumentaliColonscopia != null ? esamiStrumentaliColonscopia.getTipo() : AcromegaliaSchedaBase.NESSUN_VALORE);

			acroSBView.setEcocardiografia(acroDBorig.getFlgEcocardiografia());
			acroSBView.setEcocardiografiaDescr(acroDBorig.getDescrizioneEcocardiografia());

			acroSBView.setDopplerTSA(acroDBorig.getFlgDopplerTsa());
			acroSBView.setDopplerTSADescr(acroDBorig.getDescrizioneDopplerTsa());

			acroSBView.setEcografiaAddome(acroDBorig.getFlgEcogradiaAddomeCompleto());
			acroSBView.setEcografiaAddomeDescr(acroDBorig.getDescrizioneEcografiaAddomeCompleto());

			acroSBView.setTcAddome(acroDBorig.getFlgTcAddome());
			acroSBView.setTcAddomeDescr(acroDBorig.getDescrizioneTcAddome());

			acroSBView.setCampoVisivo(acroDBorig.getFlgCampoVisivo());
			acroSBView.setCampoVisivoDescr(acroDBorig.getDescrizioneCampoVisivo());

			acroSBView.setAngioRMN(acroDBorig.getFlgAngioRmnCelebrale());
			acroSBView.setAngioRMNDescr(acroDBorig.getDescrizioneAngioRmnCelebrale());

			acroSBView.setDexa(acroDBorig.getFlgDexa());

			acroSBView.setRxColonna(acroDBorig.getFlgRxColonna());
			acroSBView.setRxColonnaDescr(acroDBorig.getDescrizioneRxColonna());

			acroSBView.setAltroDescr(acroDBorig.getDescrizioneEsameStrumentaleAltro());

			/* Patologie */
			Map<String, String> mappaPatologie = new HashMap<>();
			Map<Integer, Boolean> mappaPatologieIds = new HashMap<>();
			Map<Integer, String> mappaPatologieDescr = new HashMap<>();
			@SuppressWarnings("unchecked")
			Set<MmAcroSbPatologie> mmPatolgies = acroDBorig.getMmAcroSbPatologies();
			Patologie currPatologia = null;
			for (MmAcroSbPatologie patologie : mmPatolgies) {

				/* Recupero la patologia */
				currPatologia = patologie.getPatologie();
				
				mappaPatologie.put(currPatologia.getNomePatologia(), 
						patologie.getDescrizionePatologia());
				mappaPatologieIds.put(currPatologia.getIdPatologie(), true);
				mappaPatologieDescr.put(currPatologia.getIdPatologie(), patologie.getDescrizionePatologia());
			}
			acroSBView.setPatologieOut(mappaPatologie);
			acroSBView.setPatologie(mappaPatologieIds);
			acroSBView.setPatologieDescr(mappaPatologieDescr);

		}   // if (acroDBorig != null)...

		return acroSBView;
	}

	/**
	 * <p>Effettua la conversione fra un oggetto di tipo view e un bean 
	 *    per un paziente.
	 * </p>
	 * 
	 * @param acroView Oggetto di tipo view
	 * @param idMalattia Eventuale identificativo del bean da creare/modificare
	 */ 
	public AcromegaliaSchedeBase map(AcromegaliaSchedaBase acroView, 
			Integer idMalattia,
			Map<String, EsamiStrumentali> colonscopia, 
			Map<String, EsamiStrumentali> tiroide) {

		AcromegaliaSchedeBase acromegaliaSB = null;
		/* 
		 * Se l'identificativo della malattia non e' null, recupero il bean 
		 * da modificare.
		 */
		if (idMalattia != null) {
			
			/* Modifica */
			acromegaliaSB = this.getSchedaBaseBean(idMalattia);
		} else {
			
			/* Inserimento */
			acromegaliaSB = new AcromegaliaSchedeBase();
		}
		
		if (acroView != null) {

			acromegaliaSB.setAnnoDiagnosi(
					acroView.getAnnoDataDiagnosi() != null ? acroView.getAnnoDataDiagnosi().intValue() : null);
			acromegaliaSB.setMeseDiagnosi(
					acroView.getMeseDataDiagnosi() != null ? acroView.getMeseDataDiagnosi().intValue() : null);

			Double[] ritmoGH = acroView.getRitmoGH();
			acromegaliaSB.setRitmoGh1(ritmoGH[0] != null ? new BigDecimal(ritmoGH[0]) : null);
			acromegaliaSB.setRitmoGh2(ritmoGH[1] != null ? new BigDecimal(ritmoGH[1]) : null);
			acromegaliaSB.setRitmoGh3(ritmoGH[2] != null ? new BigDecimal(ritmoGH[2]) : null);

			Double igf1 = acroView.getIgf1();
			if (igf1 != null) {
				acromegaliaSB.setIgf1(new BigDecimal(igf1));
			}   // if (igf1 != null)..

			Double[] ogttH = acroView.getOgttGH();
			acromegaliaSB.setOgttGh0(ogttH[0] != null ? new BigDecimal(ogttH[0]) : null);
			acromegaliaSB.setOgttGh30(ogttH[1] != null ? new BigDecimal(ogttH[1]) : null);
			acromegaliaSB.setOgttGh60(ogttH[2] != null ? new BigDecimal(ogttH[2]) : null);
			acromegaliaSB.setOgttGh90(ogttH[3] != null ? new BigDecimal(ogttH[3]) : null);
			acromegaliaSB.setOgttGh120(ogttH[4] != null ? new BigDecimal(ogttH[4]) : null);

			Double[] ogttGlicemia = acroView.getOgttGlicemia();
			acromegaliaSB.setOgttGlicemia0(ogttGlicemia[0] != null ? new BigDecimal(ogttGlicemia[0]) : null);
			acromegaliaSB.setOgttGlicemia30(ogttGlicemia[1] != null ? new BigDecimal(ogttGlicemia[1]) : null);
			acromegaliaSB.setOgttGlicemia60(ogttGlicemia[2] != null ? new BigDecimal(ogttGlicemia[2]) : null);
			acromegaliaSB.setOgttGlicemia90(ogttGlicemia[3] != null ? new BigDecimal(ogttGlicemia[3]) : null);
			acromegaliaSB.setOgttGlicemia120(ogttGlicemia[4] != null ? new BigDecimal(ogttGlicemia[4]) : null);

			Double[] ogttInsulina = acroView.getOgttInsulina();
			acromegaliaSB.setOgttInsulina0(ogttInsulina[0] != null ? new BigDecimal(ogttInsulina[0]) : null);
			acromegaliaSB.setOgttInsulina30(ogttInsulina[1] != null ? new BigDecimal(ogttInsulina[1]) : null);
			acromegaliaSB.setOgttInsulina60(ogttInsulina[2] != null ? new BigDecimal(ogttInsulina[2]) : null);
			acromegaliaSB.setOgttInsulina90(ogttInsulina[3] != null ? new BigDecimal(ogttInsulina[3]) : null);
			acromegaliaSB.setOgttInsulina120(ogttInsulina[4] != null ? new BigDecimal(ogttInsulina[4]) : null);

			Double[] dimensioni = acroView.getDimensioni();
			acromegaliaSB.setDimAdenomaX(dimensioni[0] != null ? new BigDecimal(dimensioni[0]) : null);
			acromegaliaSB.setDimAdenomaY(dimensioni[1] != null ? new BigDecimal(dimensioni[1]) : null);
			acromegaliaSB.setDimAdenomaZ(dimensioni[2] != null ? new BigDecimal(dimensioni[2]) : null);

			acromegaliaSB.setTipoAdenoma(acroView.getTipoAdenoma());
			acromegaliaSB.setFlgInvasivo(acroView.isInvasivo() == true ? 0 : 1);

			acromegaliaSB.setDescrizioneTerapiaMedica(acroView.getTerapiaMedicaDescrizione());
			Integer[] terapieMediche = acroView.getTerapieMediche();
			TerapieMediche currTerapia = null;
			MmAcromegliaSbTerapieMediche currAcroTerMed = null;

			/* Recupero il DAO */
			ITerapieMedicheDao terapieMedicheDao = this.getTerapieMedicheDao();
			if (idMalattia != null) {
				
				/* 
				 * Costruisco un insieme con gli indici delle 
				 * terapie mediche.
				 */
				Set<Integer> idTerapieSet = new HashSet<>();
				Set<Integer> newIdTerapieSet = new HashSet<>();
				for (Integer idTerapia : terapieMediche) {
					
					idTerapieSet.add(idTerapia);
					newIdTerapieSet.add(idTerapia);
				}   // end for (Integer idTerapia : terapieMediche)...
				
				/* 
				 * Ciclo sulle vecchie terapie e verifico se ce ne sono 
				 * da togliere.
				 */
				Set oldTerapie = 
						acromegaliaSB.getMmAcromegliaSbTerapieMediches();
				ArrayList<MmAcromegliaSbTerapieMediche> terapieToRemove = 
						new ArrayList<MmAcromegliaSbTerapieMediche>();
				MmAcromegliaSbTerapieMediche mmTerapia = null;
				Integer idTerapia = null;
				for (Object oldTerapia : oldTerapie) {
					
					mmTerapia = (MmAcromegliaSbTerapieMediche) oldTerapia;
					idTerapia = mmTerapia.getTerapieMediche().getIdTerapiaMedica();
					
					/* Verifico se presente ancora la terapia */
					if (!idTerapieSet.contains(idTerapia)) {
						
						/* Segnalo la terapia come pronta per rimozione */
						terapieToRemove.add(mmTerapia);
						
						/* Disassocio la terapia dalla scheda */
						mmTerapia.setAcromegaliaSchedeBase(null);
					} else {
						
						/* Non e' da inserire */
						newIdTerapieSet.remove(idTerapia);
					}   // end if (!idTerapieSet...
					
				}   // end for (MmAcromegliaSbTerapieMediche...
				
				/* Rimuovo le vecchie terapie */
				acromegaliaSB.getMmAcromegliaSbTerapieMediches().removeAll(terapieToRemove);
				terapieToRemove.clear();
				
				/* Ciclo su quelle da inserire */
				for (Integer idTerapiaToInsert : newIdTerapieSet) {
					
					/* Recupero la terapia */
					currTerapia = 
							terapieMedicheDao.findById(
									idTerapiaToInsert);
	
					currAcroTerMed = new MmAcromegliaSbTerapieMediche();
					currAcroTerMed.setAcromegaliaSchedeBase(acromegaliaSB);
					acromegaliaSB.getMmAcromegliaSbTerapieMediches().add(currAcroTerMed);
					currAcroTerMed.setTerapieMediche(currTerapia);
				}
			} else {
			
				for (int i = 0; i < terapieMediche.length; i++) {
	
					/* Recupero la terapia */
					currTerapia = 
							terapieMedicheDao.findById(
									terapieMediche[i]);
	
					currAcroTerMed = new MmAcromegliaSbTerapieMediche();
					currAcroTerMed.setAcromegaliaSchedeBase(acromegaliaSB);
					acromegaliaSB.getMmAcromegliaSbTerapieMediches().add(currAcroTerMed);
					currAcroTerMed.setTerapieMediche(currTerapia);
				}   // for (int i = 0; i < terapieMediche.length; i++)...
			}

			acromegaliaSB.setFlgRadioterapia(acroView.isRadioterapia() == true ? 0 : 1);
			acromegaliaSB.setDescrizioneRadioterapia(acroView.getRadioterapiaDescr());

			acromegaliaSB.setFlgAdenomiIpofisari(acroView.isAdenomiIpofisari() == true ? 0 : 1);
			acromegaliaSB.setDescrizioneAdenomiIpofisari(acroView.getAdenomiIpofisariDescr());

			acromegaliaSB.setFlgNeoplasia(acroView.isNeoplasia() == true ? 0 : 1);
			acromegaliaSB.setDescrizioneNeoplasia(acroView.getNeoplasiaDescr());

			acromegaliaSB.setDescrizioneRaccordoAnamnestico(acroView.getRaccordoAnamnesticoDescr());

			acromegaliaSB.setAnnoChirurgia(acroView.getInterventoAnno() != null ? acroView.getInterventoAnno().intValue() : null);
			acromegaliaSB.setMeseChirurgia(acroView.getInterventoMese() != null ? acroView.getInterventoMese().intValue() : null);

			acromegaliaSB.setFlgIstologia(acroView.isIstologia() == true ? 0 : 1);
			acromegaliaSB.setDescrizioneIstologia(acroView.getIstologiaDescrizione());

			Set mmAcroImmuno = acromegaliaSB.getMmAcromegaliaSbImmunoistochimicas();
			MmAcromegaliaSbImmunoistochimica currImmuno = null;
			
			Map<Integer, Boolean> viewAcroImmunoTrue = acroView.getImmunoIstoChimicaTrue();
			Map<Integer, Boolean> viewAcroImmunoFalse = acroView.getImmunoIstoChimicaFalse();
			
			/* Recupero il DAO */
			IImmunoistochimicaDao immunoDao = this.getImmunoistochimicaDao();
			Immunoistochimica currImmunoistochimica = null;
			
 			if (idMalattia != null) {
 				
 				ArrayList<MmAcromegaliaSbImmunoistochimica> immunoToRemove = new ArrayList<>();
 				
 				/* Recupero l'insieme delle chiavi positive e negative */
 				Set<Integer> keyPlus = viewAcroImmunoTrue.keySet();
 				// Set<Integer> keyNeg = viewAcroImmunoFalse.keySet();
 				
 				/* Scorro sui vecchi valori */
 				Integer currImmunoId = null;
 				for (Object immuno : mmAcroImmuno) {
 					
 					currImmuno = (MmAcromegaliaSbImmunoistochimica) immuno;
 					currImmunoId = currImmuno.getImmunoistochimica().getIdImmunoistochimica();
 					if (viewAcroImmunoTrue.get(currImmunoId) == null && viewAcroImmunoFalse.get(currImmunoId) == null) {
 						
 						immunoToRemove.add(currImmuno);
 						currImmuno.setImmunoistochimica(null);
 					} else {
 						
 						if (viewAcroImmunoTrue.get(currImmunoId) != null) {
 							
 							currImmuno.setFlgPlus(0);
 							currImmuno.setFlgMinus(null);
 							
 							/* Non e' da inserire */
 							keyPlus.remove(currImmunoId);
 						} else {
 							
 							currImmuno.setFlgMinus(0);
 							currImmuno.setFlgPlus(null);
 							
 							keyPlus.remove(currImmunoId);
 						}   // end if (keyPlus.contains(currImmunoId))...
 					}   // end if (!keyPlus.contains(currImmunoId)...
 					
 				}   // end for (MmAcromegaliaSbImmunoistochimica immuno...
 				
 				/* Elimino le immunoistochimiche */
 				mmAcroImmuno.removeAll(immunoToRemove);
 				immunoToRemove.clear();
 				
 				/* Inserisco le proprieta' rimaste */
 				
 				for (Integer idImmuno : keyPlus) {
					
 					if (viewAcroImmunoTrue.get(idImmuno) != null) {
 						// POSITIVE
	 					currImmuno = new MmAcromegaliaSbImmunoistochimica();
	 					currImmuno.setAcromegaliaSchedeBase(acromegaliaSB);
	 					currImmuno.setFlgPlus(0);
	 					currImmuno.setImmunoistochimica(immunoDao.findById(idImmuno));
	 					
	 					mmAcroImmuno.add(currImmuno);
 					} else if (viewAcroImmunoFalse.get(idImmuno) != null) {
 						// NEGATIVE
 						currImmuno = new MmAcromegaliaSbImmunoistochimica();
 	 					currImmuno.setAcromegaliaSchedeBase(acromegaliaSB);
 	 					currImmuno.setFlgMinus(0);
 	 					currImmuno.setImmunoistochimica(immunoDao.findById(idImmuno));
 	 					
 	 					mmAcroImmuno.add(currImmuno);
 					}   // end if (viewAcroImmunoTrue.get(currImmunoId) != null)...
				}   // end for (Integer idImmuno : keyPlus)...
 			} else {
			
				/* Valori positivi */
				for (Integer idImmuno: viewAcroImmunoTrue.keySet()) {
					
					Boolean plus = viewAcroImmunoTrue.get(idImmuno);
					if (plus != null) {
	
						/* 
						 * Recupero l'oggetto che rappresenta 
						 * l'immunoistochimica 
						 */
						currImmunoistochimica = immunoDao.findById(idImmuno);
	
						currImmuno = new MmAcromegaliaSbImmunoistochimica();
						currImmuno.setAcromegaliaSchedeBase(acromegaliaSB);
						mmAcroImmuno.add(currImmuno);
						currImmuno.setImmunoistochimica(currImmunoistochimica);
	
						if (plus == true) {
							currImmuno.setFlgPlus(0);
						}
					}   // if (plus != null)...
	
				}   // for (Immunoistochimica immunoistochimica...
				
				/* Valori negativi */
				for (Integer idImmuno: viewAcroImmunoFalse.keySet()) {
					
					Boolean minus = viewAcroImmunoFalse.get(idImmuno);
					if (minus != null) {
	
						/* 
						 * Recupero l'oggetto che rappresenta 
						 * l'immunoistochimica 
						 */
						currImmunoistochimica = immunoDao.findById(idImmuno);
	
						currImmuno = new MmAcromegaliaSbImmunoistochimica();
						currImmuno.setAcromegaliaSchedeBase(acromegaliaSB);
						mmAcroImmuno.add(currImmuno);
						currImmuno.setImmunoistochimica(currImmunoistochimica);
	
						if (minus == false) {
							currImmuno.setFlgMinus(0);
						}
					}   // if (plus != null)...
	
				}   // for (Immunoistochimica immunoistochimica...
 			}
			acromegaliaSB.setMeseEcografiaTiroide(acroView.getEcoTiroideMese() != null ? acroView.getEcoTiroideMese().intValue() : null);
			acromegaliaSB.setAnnoEcografiaTiroide(acroView.getEcoTiroideAnno() != null ? acroView.getEcoTiroideAnno().intValue() : null);
			acromegaliaSB.setFlgEcografiaTiroideAgoAspirato(acroView.isAgoaspirato() == true ? 0 : 1);
			acromegaliaSB.setDescrizioneEcografiaTiroideAa(acroView.getAgoaspiratoDescr());
			String szTipoTiroide = acroView.getTipoTiroide();
			if (szTipoTiroide != null && !szTipoTiroide.equals("")) {
				EsamiStrumentali tipoEcoTiroide = tiroide.get(szTipoTiroide);
				acromegaliaSB.setEsamiStrumentaliByIdEsameStrumentaleEcografiaTiroide(tipoEcoTiroide);
			} else {
				
				acromegaliaSB.setEsamiStrumentaliByIdEsameStrumentaleEcografiaTiroide(null);
			}   // end if (szTipoTiroide != null...
			acromegaliaSB.setMeseColonscopia(acroView.getColonscopiaMese() != null ? acroView.getColonscopiaMese().intValue() : null);
			acromegaliaSB.setAnnoColonscopia(acroView.getColonscopiaAnno() != null ? acroView.getColonscopiaAnno().intValue() : null);
			acromegaliaSB.setFlgColonscopiaIstologia(acroView.isIstoColonscopia() == true ? 0 : 1);
			acromegaliaSB.setDescrizioneColonscopiaIstologia(acroView.getIstoColonscopiaDescr());
			String szTipoColonscopia = acroView.getTipoColonscopia();
			if (szTipoColonscopia != null && !szTipoColonscopia.equals("")) {
				
				EsamiStrumentali tipoColonscopia = colonscopia.get(szTipoColonscopia);
				acromegaliaSB.setEsamiStrumentaliByIdEsameStrumentaleColonscopia(tipoColonscopia);
			} else {
				
				acromegaliaSB.setEsamiStrumentaliByIdEsameStrumentaleColonscopia(null);
			}   // end if (szTipoColonscopia != null...
			acromegaliaSB.setFlgEcocardiografia(acroView.getEcocardiografia());
			acromegaliaSB.setDescrizioneEcocardiografia(acroView.getEcocardiografiaDescr());

			acromegaliaSB.setFlgDopplerTsa(acroView.getDopplerTSA());
			acromegaliaSB.setDescrizioneDopplerTsa(acroView.getDopplerTSADescr());

			acromegaliaSB.setFlgEcogradiaAddomeCompleto(acroView.getEcografiaAddome());
			acromegaliaSB.setDescrizioneEcografiaAddomeCompleto(acroView.getEcografiaAddomeDescr());

			acromegaliaSB.setFlgTcAddome(acroView.getTcAddome());
			acromegaliaSB.setDescrizioneTcAddome(acroView.getTcAddomeDescr());

			acromegaliaSB.setFlgCampoVisivo(acroView.getCampoVisivo());
			acromegaliaSB.setDescrizioneCampoVisivo(acroView.getCampoVisivoDescr());

			acromegaliaSB.setFlgAngioRmnCelebrale(acroView.getAngioRMN());
			acromegaliaSB.setDescrizioneAngioRmnCelebrale(acroView.getAngioRMNDescr());

			acromegaliaSB.setFlgDexa(acroView.getDexa());

			acromegaliaSB.setFlgRxColonna(acroView.getRxColonna());
			acromegaliaSB.setDescrizioneRxColonna(acroView.getRxColonnaDescr());

			acromegaliaSB.setDescrizioneEsameStrumentaleAltro(acroView.getAltroDescr());

			/* Elaboro le patologie */
			Map<Integer, Boolean> patologie = acroView.getPatologie();
			Map<Integer, String> patologieDescr = acroView.getPatologieDescr();
			Patologie currPatologia = null;
			Boolean currPatolgiaBoolean = null;
			String currPatologiaDescr = null;
			IPatologieDao patologieDao = this.getPatologieDao();
			MmAcroSbPatologie currMmPatologie = null;
			Set mmPatolgies = acromegaliaSB.getMmAcroSbPatologies();
			
			/* Insieme di chiavi di patologie */
			Set<Integer> patologieIds = patologie.keySet();
			
			if (idMalattia != null) {
				
				/* Ciclo sulle patologie gia' in essere */
				Integer currPatologiaId = null;
				ArrayList<MmAcroSbPatologie> patologieToRemove = new ArrayList<>();
				for (Object patologia : mmPatolgies) {
				
					currMmPatologie = (MmAcroSbPatologie) patologia;
					
					/* Verifico se la patologia e' ancora presente */
					currPatologiaId = currMmPatologie.getPatologie().getIdPatologie();
					if (patologie.get(currPatologiaId) == null) {
						
						/* La patologia non e' piu' presente */
						patologieToRemove.add(currMmPatologie);
						currMmPatologie.setAcromegaliaSchedeBase(null);
					} else {
						
						/* 
						 * Modifico la descrizione eventuale collegata 
						 * alla patologia e segnalo che la patologia non
						 * e' da considerare come nuovo inserimento.
						 */
						currMmPatologie.setDescrizionePatologia(
								patologieDescr.get(currPatologiaId));
						patologieIds.remove(currPatologiaId);
					}   // end if (!patologieIds.contains(currPatologiaId))...
				}   // end for (Object patologia : mmPatolgies)...
				
				/* Rimuovo le patologie */
				mmPatolgies.removeAll(patologieToRemove);
				patologieToRemove.clear();
				
				// FIXME Da rivedere e comporre con il caso di inserimento
				/* Ciclo sulle patolgie inserite in modifica e le inserisco */
				for (Integer patologieId : patologieIds) {
					
					/* Recupero il booleano che indica se la patologia e' stata scelta */
					currPatolgiaBoolean = patologie.get(patologieId);
					if (currPatolgiaBoolean != null) {

						/* Recupero la descrizione utente */
						currPatologiaDescr = patologieDescr.get(patologieId);

						/* Recupero la patologia reale */
						currPatologia = patologieDao.findById(patologieId);

						/* Creo l'oggetto molti a molti */
						currMmPatologie = new MmAcroSbPatologie();
						currMmPatologie.setAcromegaliaSchedeBase(acromegaliaSB);
						currMmPatologie.setPatologie(currPatologia);
						currMmPatologie.setDescrizionePatologia(currPatologiaDescr);
						mmPatolgies.add(currMmPatologie);

					}   // if (currPatolgia != null)...
				}   // end for (Integer patologieId : patologie.keySet())...
			} else {
			
				for (Integer patologieId : patologie.keySet()) {
	
					/* Recupero il booleano che indica se la patologia e' stata scelta */
					currPatolgiaBoolean = patologie.get(patologieId);
					if (currPatolgiaBoolean != null) {
	
						/* Recupero la descrizione utente */
						currPatologiaDescr = patologieDescr.get(patologieId);
	
						/* Recupero la patologia reale */
						currPatologia = patologieDao.findById(patologieId);
	
						/* Creo l'oggetto molti a molti */
						currMmPatologie = new MmAcroSbPatologie();
						currMmPatologie.setAcromegaliaSchedeBase(acromegaliaSB);
						currMmPatologie.setPatologie(currPatologia);
						currMmPatologie.setDescrizionePatologia(currPatologiaDescr);
						mmPatolgies.add(currMmPatologie);
	
					}   // if (currPatolgia != null)...
				}   // for (Integer patologieId : patologie.keySet())...
			}   // end if (idMalattia != null)...
		}   // if (pazienteProxy != null)...

		return acromegaliaSB;
	}
	
	/**
	 * <p>Effettua la persistenza della scheda base.
	 * </p>
	 * 
	 * @param schedaBase Le informazioni da persistere.
	 */
	public void inserisci(AcromegaliaSchedeBase schedaBase) {
		
		this.acromegaliaSchedeBaseDao.saveOrUpdate(schedaBase);
	}

	public IAcromegaliaSchedeBaseDao getAcromegaliaSchedeBaseDao() {
		return acromegaliaSchedeBaseDao;
	}

	public void setAcromegaliaSchedeBaseDao(
			IAcromegaliaSchedeBaseDao acromegaliaSchedeBaseDao) {
		this.acromegaliaSchedeBaseDao = acromegaliaSchedeBaseDao;
	}


}
